<?php

/**
 * 抽象工厂
 * 
 * 概述：为创建一组相关或相互依赖的对象提供一个接口，而且无需指定他们的具体类
 * 
 * 类型：创建型模式
 * 
 * 角色：
 * 	1，抽象工厂。
 *  2，具体工厂。
 *  3，抽象产品。
 *  4，具体产品。
 *  
 * 优点：
 *  1，增加产品族时，支持开闭原则。
 *  
 * 缺点：
 *  2，增加产品结构时，违反开闭原则。
 */

/**
 * 抽象工厂
 */
interface AbstractFactory
{
	public function createProductA();
	public function createProductB();
}

/**
 * 具体工厂1
 */
class ConcreteFactory1 implements AbstractFactory
{
	public function createProductA()
	{
		return new ProductA1();
	}
	
	public function createProductB()
	{
		return new ProductB1();
	}
}

/**
 * 具体工厂2
 */
class ConcreteFactory2 implements AbstractFactory
{
	public function createProductA()
	{
		return new ProductA2();
	}
	
	public function createProductB()
	{
		return new ProductB2();
	}
}

interface AbstractProductA
{
	
}

interface AbstractProductB
{
	
}

class ProductA1 implements AbstractProductA
{
	public function __construct()
	{
		echo 'ProductA1 被创建。<br/>';
	}
}

class ProductA2 implements AbstractProductA
{
	public function __construct()
	{
		echo 'ProductA2 被创建。<br/>';
	}
}

class ProductB1 implements AbstractProductB
{
	public function __construct()
	{
		echo 'ProductB1 被创建。<br/>';
	}
}

class ProductB2 implements AbstractProductB
{
	public function __construct()
	{
		echo 'ProductB2 被创建。<br/>';
	}
}

class Client
{
	public static function main()
	{
		$factory = new ConcreteFactory1();
		$factory->createProductA();
		$factory->createProductB();
	}
}

Client::main();